#ifndef PIXDMANAGER_H
#define PIXDMANAGER_H

class ProjectManager;

#include <QObject>
#include <QAction>
#include <QMenuBar>
#include <QMainWindow>
#include <QDockWidget>
#include <QPushButton>
#include <QStatusBar>
#include <QMimeData>
#include <QString>

#include "gui/mainwindow.h"
#include "ProjectManager/projectmanager.h"
#include "Atlas/canvas.h"
#include "Atlas/newatlas.h"
#include "XML/Document.h"


#include <string>
#include <fstream>
#include <vector>
#include <stack>


/* @brief   La classe PixDManager sert à gérer plein de trucs   */
class PixDManager : public QObject{
    Q_OBJECT

    /********************************************
     *              Public
     ********************************************/
    public:

        /******************************
         *      Constructors
         ******************************/

            PixDManager();

            /*! @brief  Le vrai constructeur d'un objet "manager" sera initialize, car il n'est pas
             *          possible de lié des signaux avec un objet en cours de construction  */
            void Initialize();

        /********************************
         *      Methods
         ********************************/

        /********************************
         *      Properties
         ********************************/

            MainWindow*         m_MainWindow;       /*!< Enregistre une référence vers la fenêtre principale    */

    /*******************************************
     *              Private
     ********************************************/
    private :

    /******************************
     *       Interface
     ******************************/

        /******************************
         *       Menu
         ******************************/

            /*! Initialise et construit le menu de la fenêtre principale    */
            void    CreateMenu();

            QMenu * GetProjectMenu();
            QMenu * GetFileMenu();

            /*! @brief Retourne la liste des projets récents sous la forme d'un menu.
             *         Le menu contiendra des FileAction, connecté à la méthode OpenProject */
            QMenu*  GetRecentProjectsMenu();

        /******************************
         *       Window
         ******************************/

            void CreateMainWindow();

            /*! Crée et rajoute le dock permettant de controler l'atlas */
            void CreateDockWidget();

            void CreateProjectWidget();

            /*! @brief  Méthode qui se charge de connecter les signaux de la vue qui sera créée par
             *          la méthode ReturnView() */
            void ConnectView(QTreeView * view);

            /*! @brief Retourne une vue du gestionnaire de fichier insérable dans un widget */
            QWidget * ReturnView();


        /******************************
         *       Actions
         ******************************/

            void CreateActions();

        /******************************
         *       Others
         ******************************/

            /*! @brief Récupère les projets récents dans un fichier situé à la racine de l'éxécutable */
            void LoadRecentsProjects();

        /******************************
         *      Properties
         ******************************/

            QDockWidget * m_InspectorWidget;
            QDockWidget * m_ToolWidget;

            /******************************
             *      Project
             ******************************/

                vector<Component*>      m_ComponentOpened;

                /*! Enregistre les projets ouvert à l'intérieur du programme   */
                vector<Project*>        m_ProjectsOpened;

                /*! Répertorie les projets récents                              */

                vector<string >          m_RecentsProjects;

                /*! Modèle utilisé pour enregistrer les projets chargés */
                QStandardItemModel *    m_Model;

                QMenu*                  m_RecentsProjectMenu;

                vector<QAction*>        m_RecentsProjectsActions;

        /********************************************
         *              Actions
         ********************************************/

            // File Menu
            QAction*    m_NewProject;
            QAction*    m_OpenProject;
            QAction*    m_SaveProject;
            QAction*    m_SaveProjectAs;
            QAction*    m_Quit;

            // Project Menu
            QAction *   m_NewAtlas;
            QAction *   m_NewTileSet;
            QAction *   m_NewTileMap;

    /******************************
     *       Slots
     ******************************/
    public slots:

        //Creation slots

        void CreateNewProject();
        void ProjectCreated(Project * proj);

        void OpenProject(string path);

        void SaveProject();
        void SaveProjectAs();

        // Insertion slots, components send signals with a QWidget to display on the MainWindow

        void SetCentralWidget(QWidget * widget);
        void SetInspectorWidget(QWidget * widget);
        void SetToolWidget(QWidget * widget);

        void ShowAtlas(Atlas * m_Atlas);

        /*! @brief  Ce slot sera exécuté lorsqu'un nouveau projet à été crée. Il servira à mettre à
         *          jour le fichier contenant la liste des projets récents  */
        void UpdateRecentsProjects();

        void ViewDoubleCkicked(const QModelIndex index);
        void ViewClicked(const QModelIndex index);



};

#endif // PIXDMANAGER_H
